home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue28 / survive / TDataset / Reader1.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1997-10-20  |  10.1 KB  |  350 lines

  1. unit Reader1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   DB, MyDS, StdCtrls, TypInfo, MyTable, ComCtrls, ExtCtrls, DBCtrls, Grids,
  8.   DBGrids, DBTables, DBClient;
  9.  
  10. type
  11.   PTestRec = ^TTestRec;
  12.   TTestRec = packed record
  13.       DelFlag: Byte;
  14.       EmpNo: SmallInt;
  15.       FirstName: string[15];
  16.       LastName: string[20];
  17.       HireDate: TDateTime;
  18.       DeptNo: string[3];
  19.       Salary: Double;
  20.       NullFlags: LongInt;
  21.     end;
  22.  
  23.   TForm1 = class(TForm)
  24.     btnTest: TButton;
  25.     btnClose: TButton;
  26.     MyTable1: TMyTable;
  27.     PageControl1: TPageControl;
  28.     TabSheet1: TTabSheet;
  29.     TabSheet2: TTabSheet;
  30.     Memo1: TMemo;
  31.     btnTest2: TButton;
  32.     DataSource1: TDataSource;
  33.     DBGrid1: TDBGrid;
  34.     DBNavigator1: TDBNavigator;
  35.     Table1: TTable;
  36.     Database1: TDatabase;
  37.     MyTable1EmpNo: TSmallintField;
  38.     MyTable1FirstName: TStringField;
  39.     MyTable1LastName: TStringField;
  40.     MyTable1HireDate: TDateTimeField;
  41.     MyTable1DeptNo: TStringField;
  42.     MyTable1Salary: TFloatField;
  43.     procedure btnTest1Click(Sender: TObject);
  44.     procedure btnCloseClick(Sender: TObject);
  45.     procedure btnTest2Click(Sender: TObject);
  46.     procedure FormCreate(Sender: TObject);
  47.   private
  48.   public
  49.     procedure DumpCurrentRec1;
  50.     procedure DumpCurrentRec2;
  51.   end;
  52.  
  53. var
  54.   YesNo: array[Boolean] of Char = ('N', 'Y');
  55.   Form1: TForm1;
  56.  
  57. implementation
  58.  
  59. {$R *.DFM}
  60.  
  61. procedure TForm1.DumpCurrentRec1;
  62. var
  63.   RecBuffer: TTestRec;
  64. begin
  65.   if MyTable1.GetCurrentRecord(@RecBuffer) then
  66.     with RecBuffer do
  67.       Memo1.Lines.Add(Format('%3d %3d %-15s %-20s %10s %3s %11.0m',
  68.                              [MyTable1.RecNo, EmpNo, FirstName,
  69.                               LastName, DateToStr(HireDate),
  70.                               DeptNo, Salary])
  71.                      );
  72. end;
  73.  
  74. procedure TForm1.DumpCurrentRec2;
  75. begin                             
  76.   with MyTable1 do begin
  77.     Memo1.Lines.Add(Format('%3d %3d %-15s %-20s %10s %3s %11.0m %3d',
  78.                            [RecNo,
  79.                             FieldByName('EmpNo').AsInteger,
  80.                             FieldByName('FirstName').AsString,
  81.                             FieldByName('LastName').AsString,
  82.                             DateToStr(FieldByName('HireDate').AsDateTime),
  83.                             FieldByName('DeptNo').AsString,
  84.                             FieldByName('Salary').AsFloat,
  85.                             FieldByName('CalcField').AsInteger])
  86.                    );
  87.   end;
  88. end;                                       
  89.  
  90. procedure TForm1.btnTest1Click(Sender: TObject);
  91. var
  92.   BookmarkA,
  93.   BookmarkB: TBookmark;
  94.   I: Integer;
  95.   SaveDept: ShortString;
  96. begin
  97.   PageControl1.ActivePage := TabSheet1;
  98.   with MyTable1 do begin
  99. (*
  100.     Open;
  101.     try
  102.       Memo1.Lines.Add('Active = ' + IntToStr(Ord(Active)));
  103.       Memo1.Lines.Add('RecordCount = ' + IntToStr(RecordCount));
  104.       Memo1.Lines.Add('RecordSize = ' + IntToStr(RecordSize));
  105.  
  106.       Memo1.Lines.Add('');
  107.       Memo1.Lines.Add('*** Read to EOF forwards ***');
  108.       First;
  109.       while not Eof do begin
  110.         DumpCurrentRec1;
  111.         Next;
  112.       end;
  113.  
  114.       Memo1.Lines.Add('');
  115.       Memo1.Lines.Add('*** Read to BOF backwards ***');
  116.       Last;
  117.       while not Bof do begin
  118.         DumpCurrentRec1;
  119.         Prior;
  120.       end;
  121.  
  122.       Memo1.Lines.Add('');
  123.       Memo1.Lines.Add('*** Test MoveBy ***');
  124.       First;
  125.       MoveBy(10);
  126.       DumpCurrentRec1;
  127.       MoveBy(-5);
  128.       DumpCurrentRec1;
  129.  
  130.       Memo1.Lines.Add('');
  131.       Memo1.Lines.Add('*** Test Bookmarks ***');
  132.       First;
  133.       MoveBy(10);
  134.       Memo1.Lines.Add('Goto this record and bookmark it:');
  135.       DumpCurrentRec1;
  136.       BookmarkA := GetBookmark;
  137.       try
  138.         MoveBy(-5);
  139.         Memo1.Lines.Add('Then move to a different record:');
  140.         DumpCurrentRec1;
  141.         BookmarkB := GetBookmark;
  142.         try
  143.           if BookmarkValid(BookmarkA) then begin
  144.             GotoBookmark(BookmarkA);
  145.             Memo1.Lines.Add('Then return to bookmarked record:');
  146.             DumpCurrentRec1;
  147.           end;
  148.  
  149.           Memo1.Lines.Add('Compare two different bookmarks (0=same, 1=different): ' +
  150.                           IntToStr(CompareBookmarks(BookmarkA, BookmarkB)));
  151.           Memo1.Lines.Add('Compare two identical bookmarks (0=same, 1=different): ' +
  152.                           IntToStr(CompareBookmarks(BookmarkA, BookmarkA)));
  153.           Memo1.Lines.Add('Compare two nil bookmarks (0=same, 1=different): ' +
  154.                           IntToStr(CompareBookmarks(nil, nil)));
  155.         finally
  156.           FreeBookmark(BookmarkB);
  157.         end;
  158.       finally
  159.         FreeBookmark(BookmarkA);
  160.       end;
  161.  
  162.       Memo1.Lines.Add('');
  163.       Memo1.Lines.Add('*** Test Insert ***');
  164.       Insert;
  165.       try
  166.         with PTestRec(ActiveBuffer)^ do begin
  167.           EmpNo := 444;
  168.           FirstName := 'NewGuy';
  169.           LastName := 'Inserted';
  170.           HireDate := Date;
  171.           DeptNo := '621';
  172.           Salary := 100000;
  173.         end;
  174.         Post;
  175.       except
  176.         Cancel;
  177.       end;
  178.       Last;
  179.       DumpCurrentRec1;
  180.  
  181.       Memo1.Lines.Add('');
  182.       Memo1.Lines.Add('*** Test Append ***');
  183.       Append;
  184.       try
  185.         with PTestRec(ActiveBuffer)^ do begin
  186.           EmpNo := 445;
  187.           FirstName := 'NewGuy';
  188.           LastName := 'Appended';
  189.           HireDate := Date;
  190.           DeptNo := '621';
  191.           Salary := 100000;
  192.         end;
  193.         Post;
  194.       except
  195.         Cancel;
  196.       end;
  197.       Last;
  198.       DumpCurrentRec1;
  199.  
  200.       Memo1.Lines.Add('');
  201.       Memo1.Lines.Add('*** Test Update ***');
  202.       Last;
  203.       Memo1.Lines.Add('Rec Before Update:');
  204.       DumpCurrentRec1;
  205.       Edit;
  206.       try
  207.         with PTestRec(ActiveBuffer)^ do
  208.           Salary := Salary + 1000;
  209.         Post;
  210.       except
  211.         Cancel;
  212.       end;
  213.       Memo1.Lines.Add('Rec After Update:');
  214.       DumpCurrentRec1;
  215.  
  216.       Memo1.Lines.Add('');
  217.       Memo1.Lines.Add('*** Test Delete ***');
  218.       First;
  219.       MoveBy(2);
  220.       Memo1.Lines.Add('Current Record Before Delete:');
  221.       DumpCurrentRec1;
  222.       Delete;
  223.       Memo1.Lines.Add('Current Record After Delete:');
  224.       DumpCurrentRec1;
  225.       MoveBy(-1);
  226.       Memo1.Lines.Add('Current Record Before Delete:');
  227.       DumpCurrentRec1;
  228.       Delete;
  229.       Memo1.Lines.Add('Current Record After Delete:');
  230.       DumpCurrentRec1;
  231.     finally
  232.       Close;
  233.     end;
  234. *)
  235.     Open;
  236.     try
  237.       Memo1.Lines.Add('Active = ' + IntToStr(Ord(Active)));
  238.       Memo1.Lines.Add('RecordCount = ' + IntToStr(RecordCount));
  239.       Memo1.Lines.Add('RecordSize = ' + IntToStr(RecordSize));
  240.  
  241.       Memo1.Lines.Add('');
  242.       Memo1.Lines.Add('*** Test FieldDefs ***');
  243.       Memo1.Lines.Add('Number of Fields: ' + IntToStr(FieldDefs.Count));
  244.       Memo1.Lines.Add('');
  245.       Memo1.Lines.Add('NO NAME       DATATYPE     SIZE REQ');
  246.       for I := 0 to FieldDefs.Count - 1 do
  247.         with Memo1.Lines, FieldDefs[I] do
  248.           Add(Format('%2d %-10s %-12s %3d   %s',
  249.                      [FieldNo,
  250.                       Name,
  251.                       GetEnumName(TypeInfo(TFieldType), Ord(DataType)),
  252.                       Size,
  253.                       YesNo[Required]]));
  254.  
  255.       Memo1.Lines.Add('');
  256.       Memo1.Lines.Add('*** Test Fields ***');
  257.       Memo1.Lines.Add('Number of Fields: ' + IntToStr(FieldCount));
  258.       Memo1.Lines.Add('');
  259.       Memo1.Lines.Add('NO NAME       DATATYPE     SIZE REQ');
  260.       for I := 0 to FieldCount - 1 do
  261.         with Memo1.Lines, Fields[I] do
  262.           Add(Format('%2d %-10s %-12s %3d   %s',
  263.                      [FieldNo,
  264.                       FieldName,
  265.                       GetEnumName(TypeInfo(TFieldType), Ord(DataType)),
  266.                       DataSize,
  267.                       YesNo[Required]]));
  268.  
  269.       Memo1.Lines.Add('');
  270.       Memo1.Lines.Add('*** Read to EOF forwards ***');
  271.       First;
  272.       while not Eof do begin
  273.         DumpCurrentRec2;
  274.         Next;
  275.       end;
  276.  
  277.       Memo1.Lines.Add('');
  278.       Memo1.Lines.Add('*** Test modifying field data ***');
  279.       Last;
  280.       Memo1.Lines.Add('Rec Before Update:');
  281.       DumpCurrentRec2;
  282.       Edit;
  283.       FieldByName('Salary').AsFloat := FieldByName('Salary').AsFloat + 1000;
  284.       Post;
  285.       First;  { Move the file pointer to prove the data is stored }
  286.       Last;
  287.       Memo1.Lines.Add('Rec After Update:');
  288.       DumpCurrentRec2;
  289.  
  290.       Memo1.Lines.Add('');
  291.       Memo1.Lines.Add('*** Test null field data ***');
  292.       Last;
  293.       Memo1.Lines.Add('Rec Before Update------DeptNo is null (0=no, 1=yes): ' +
  294.                       IntToStr(Ord(FieldByName('DeptNo').IsNull)));
  295.       DumpCurrentRec2;
  296.  
  297.       Edit;
  298.       SaveDept := FieldByName('DeptNo').AsString;
  299.       FieldByName('DeptNo').Clear;
  300.       Post;
  301.  
  302.       First;  { Move the file pointer to prove the data is stored }
  303.       Last;
  304.       Memo1.Lines.Add('Rec After Update-------DeptNo is null (0=no, 1=yes): ' +
  305.                       IntToStr(Ord(FieldByName('DeptNo').IsNull)));
  306.       DumpCurrentRec2;
  307.  
  308.       Edit;
  309.       FieldByName('DeptNo').AsString := SaveDept;
  310.       Post;
  311.  
  312.       First;  { Move the file pointer to prove the data is stored }
  313.       Last;
  314.       Memo1.Lines.Add('Reset Back to Nonnull--DeptNo is null (0=no, 1=yes): ' +
  315.                       IntToStr(Ord(FieldByName('DeptNo').IsNull)));
  316.       DumpCurrentRec2;
  317.  
  318.       Memo1.Lines.Add('');
  319.       Memo1.Lines.Add('*** Test InsertRecord ***');
  320.       InsertRecord([200, 'Steve', 'Troxell', Date, '000', 10000]);
  321.       DumpCurrentRec2;
  322.  
  323.       Memo1.Lines.Add('');
  324.       Memo1.Lines.Add('*** Test AppendRecord ***');
  325.       InsertRecord([201, 'Jane', 'Doe', Date, '001', 20000]);
  326.       DumpCurrentRec2;
  327.     finally                           
  328.       Close;
  329.     end;
  330.   end;
  331. end;
  332.  
  333. procedure TForm1.btnTest2Click(Sender: TObject);
  334. begin
  335.   PageControl1.ActivePage := TabSheet2;
  336.   DataSource1.DataSet.Open;
  337. end;
  338.  
  339. procedure TForm1.btnCloseClick(Sender: TObject);
  340. begin
  341.   Close;
  342. end;
  343.  
  344. procedure TForm1.FormCreate(Sender: TObject);
  345. begin
  346.   PageControl1.ActivePage := TabSheet1;
  347. end;
  348.  
  349. end.
  350.